﻿//////////////////////////////////////////////////////////////////////////////
//
//  Copyright © 1998-2024 Glodon Company Limited.  All rights reserved.
//
//  Use of this software is subject to the terms of the Glodon license
//  agreement provided at the time of installation or download, or which
//  otherwise accompanies this software in either electronic or hard copy form.  
//
//////////////////////////////////////////////////////////////////////////////

// Reviewed

#pragma once
#include "GcmpDevService.h"
#include "OwnerPtr.h"
#include <string>

namespace gcmp
{
    class IObject;

    /// \brief 进度报告器接口
    /// \see IProgressObserver
    class GCMP_DEV_SERVICE_EXPORT IProgressReporter
    {
    public:
        /// \brief 创建进度报告器
        /// \param name 进度报告的名称，不允许重名
        /// \param beginImmediately 创建后是否立即开始，默认创建后立即开始；否则需要在使用前再调用BeginProgress()。
        /// \return 创建出的进度报告器
        static OwnerPtr<IProgressReporter> CreateProgressReporter(const std::wstring & name, bool beginImmediately = true);

        /// \brief 创建子进度报告器
        /// \param name 进度报告的名称，不允许重名
        /// \param beginImmediately 创建后是否立即开始，默认创建后立即开始；否则需要在使用前再调用BeginProgress()。
        /// \return 创建出的子进度报告器
        static OwnerPtr<IProgressReporter> CreateChildProgressReporter(const std::wstring & name, bool beginImmediately = true);

        /// \brief 启动进度报告
        /// \return void
        virtual void BeginProgress() = 0;

        /// \brief 结束进度报告
        /// \return void
        virtual void EndProgress() = 0;

        /// \brief 开启子进度
        /// \param start 子进度开始，有效值范围[0.0, 100.0]
        /// \param end 子进度结束，有效值范围[0.0, 100.0]。需要比start大
        /// \return bool 启动是否成功
        virtual bool BeginChildProgress(double start, double end) = 0;

        /// \brief 结束子进度
        /// \return void
        virtual void EndChildProgress() = 0;

        /// \brief 获取名字
        /// \return const std::wstring & 名字
        virtual const std::wstring& GetName() const = 0;

        /// \brief 进度报告是否已开始
        /// \return true：已开始；false：未开始
        virtual bool IsProgressBegin() const = 0;

        /// \brief 进度报告是否已结束
        /// \return true：已结束；false：未结束
        virtual bool IsProgressEnd() const = 0;

        /// \brief 获取进度值
        ///
        /// 如果当前开启了子进度，则GetProgress获得的进度值处于子进度范围内
        /// \return double 进度值
        virtual double GetProgress() = 0;

        /// \brief 设置进度值
        ///
        /// SetProgress(100.00)后进度报告并未结束，在调用EndProgress或者ProgressReporter析构时结束
        /// \param progress 进度值，有效值范围[0.0, 100.0]
        /// \return void
        virtual void SetProgress(double progress) = 0;

        /// \brief 获取进度信息字符串
        /// \return const std::wstring& 进度信息字符串
        virtual const std::wstring& GetProgressMessage() const = 0;

        /// \brief 设置进度信息字符串
        /// \return void
        virtual void SetProgressMessage(const std::wstring& message) = 0;

        /// \brief 获取当前处理的Object
        /// \return const void* Object对象
        virtual const IObject* GetProgressObject() const = 0;

        /// \brief 设置当前处理的Object
        /// \return void
        virtual void SetProgressObject(const IObject* obj) = 0;

        /// \brief 判断任务是否被取消
        /// \return true被用户取消， false没有被用户取消
        virtual bool IsCancelled() const = 0;

        /// \brief 设置任务是否被取消
        /// \param isCancelled 是否取消
        /// \return 返回true表示设置成功，否则设置失败
        virtual bool SetIsCancelled(bool isCancelled) = 0;

        /// \brief 析构函数
        /// 
        /// 只有在显示调End时，才会结束进度报告；
        /// 没有显示调用，则析构时结束。
        virtual ~IProgressReporter(){}
    };
}
